Entity Framework এ, Entity Relationships এবং Navigational Properties ডেটাবেসের টেবিলগুলোর মধ্যে সম্পর্ক এবং টেবিলগুলির মধ্যে কিভাবে ডেটা সম্পর্কিত থাকবে তা কনফিগার করে। Entity Relationships হল এক বা একাধিক টেবিলের মধ্যে সম্পর্ক গঠন করার পদ্ধতি, এবং Navigational Properties হল এমন প্রপার্টি যা Entity গুলির মধ্যে সম্পর্কের মাধ্যমে ডেটা অ্যাক্সেস করার সুবিধা প্রদান করে।
Entity Framework এ বিভিন্ন ধরনের সম্পর্ক থাকতে পারে, যেমন:
একটি One-to-One সম্পর্ক হয় যখন দুটি Entity এর মধ্যে একে অপরের সাথে একটিই সম্পর্ক থাকে। উদাহরণস্বরূপ, Student এবং StudentProfile Entity এর মধ্যে এক-থেকে-এক সম্পর্ক থাকতে পারে।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public StudentProfile StudentProfile { get; set; }
}
public class StudentProfile
{
public int StudentProfileId { get; set; }
public string Bio { get; set; }
public int StudentId { get; set; }
public Student Student { get; set; }
}
এখানে, Student এবং StudentProfile Entity গুলির মধ্যে এক-থেকে-এক সম্পর্ক আছে। StudentProfile Entity তে StudentId ফরেন কি হিসেবে কাজ করছে।
এটি হলো সবচেয়ে সাধারণ সম্পর্ক, যেখানে একটি Entity এর একটি রেকর্ড একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। যেমন, একটি Course Entity একাধিক Student Entity এর সাথে সম্পর্কিত থাকতে পারে।
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public ICollection<Student> Students { get; set; }
}
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public int CourseId { get; set; }
public Course Course { get; set; }
}
এখানে, Course Entity তে ICollection Students ব্যবহার করা হয়েছে, যা নির্দেশ করে যে একটি Course একাধিক Student এর সাথে সম্পর্কিত। আর Student Entity তে Course এর সাথে সম্পর্ক রয়েছে।
Many-to-Many সম্পর্ক তখন তৈরি হয় যখন দুটি Entity একে অপরের সাথে একাধিক সম্পর্ক রাখে। যেমন, একটি Student একাধিক Course এর সাথে সম্পর্কিত হতে পারে এবং একটি Course একাধিক Student এর সাথে সম্পর্কিত হতে পারে।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public ICollection<Student> Students { get; set; }
}
এখানে, Student এবং Course Entity গুলির মধ্যে ICollection এবং ICollection এর মাধ্যমে Many-to-Many সম্পর্ক প্রতিষ্ঠিত হয়েছে। EF Core সাধারণত Join Table তৈরি করে এই সম্পর্ক সঠিকভাবে রেপ্রেজেন্ট করতে।
Navigational Properties হল Entity ক্লাসের প্রপার্টি, যা অন্যান্য Entity গুলির মধ্যে সম্পর্কের মাধ্যমে ডেটা অ্যাক্সেস করতে সাহায্য করে। Navigational properties সাধারণত দুটি Entity এর মধ্যে সম্পর্ক স্থাপন এবং তাদের মধ্যে সম্পর্কিত ডেটা পাঠানোর কাজ করে।
নির্দিষ্ট Entity তে সম্পর্কিত অন্য Entity এর ডেটা অ্যাক্সেস করতে Navigational Properties ব্যবহার করা হয়।
যেমন, আমরা যদি একটি Course এর সাথে সম্পর্কিত সব Student গুলো দেখতে চাই, তাহলে Course Entity তে Students নামক Navigational Property ব্যবহার করা হবে।
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public ICollection<Student> Students { get; set; }
}
এখানে, Students
একটি Navigational Property যা Course Entity এর সাথে সম্পর্কিত Student গুলোকে রেফারেন্স করে। এর মাধ্যমে আপনি একটি কোর্সের সব ছাত্রদের অ্যাক্সেস করতে পারবেন।
Many-to-Many সম্পর্কের জন্য Navigational Properties ব্যবহার করা হয় দুইটি Entity তে। যেমন, Student এবং Course এর মধ্যে একটি Many-to-Many সম্পর্ক ছিল। এখানে, Student এবং Course উভয় Entity তে Navigational Properties থাকবে।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public ICollection<Student> Students { get; set; }
}
এখানে, Student Entity তে Courses
এবং Course Entity তে Students
Navigational Properties ব্যবহার করা হয়েছে।
Microsoft.EntityFrameworkCore.Proxies
প্যাকেজ ইনস্টল করতে হয় এবং ডিফল্টভাবে সম্পর্কিত Entity গুলির জন্য Navigational Properties লোড করা হয়।services.AddDbContext<ApplicationDbContext>(options =>
options.UseLazyLoadingProxies().UseSqlServer(connectionString));
var studentsWithCourses = context.Students
.Include(s => s.Courses)
.ToList();
context.Entry(student)
.Collection(s => s.Courses)
.Load();
Entity Framework এ, Entity Relationships এবং Navigational Properties ডেটাবেসের টেবিলগুলোর মধ্যে সম্পর্ক এবং টেবিলগুলির মধ্যে কিভাবে ডেটা সম্পর্কিত থাকবে তা কনফিগার করে। Entity Relationships হল এক বা একাধিক টেবিলের মধ্যে সম্পর্ক গঠন করার পদ্ধতি, এবং Navigational Properties হল এমন প্রপার্টি যা Entity গুলির মধ্যে সম্পর্কের মাধ্যমে ডেটা অ্যাক্সেস করার সুবিধা প্রদান করে।
Entity Framework এ বিভিন্ন ধরনের সম্পর্ক থাকতে পারে, যেমন:
একটি One-to-One সম্পর্ক হয় যখন দুটি Entity এর মধ্যে একে অপরের সাথে একটিই সম্পর্ক থাকে। উদাহরণস্বরূপ, Student এবং StudentProfile Entity এর মধ্যে এক-থেকে-এক সম্পর্ক থাকতে পারে।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public StudentProfile StudentProfile { get; set; }
}
public class StudentProfile
{
public int StudentProfileId { get; set; }
public string Bio { get; set; }
public int StudentId { get; set; }
public Student Student { get; set; }
}
এখানে, Student এবং StudentProfile Entity গুলির মধ্যে এক-থেকে-এক সম্পর্ক আছে। StudentProfile Entity তে StudentId ফরেন কি হিসেবে কাজ করছে।
এটি হলো সবচেয়ে সাধারণ সম্পর্ক, যেখানে একটি Entity এর একটি রেকর্ড একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। যেমন, একটি Course Entity একাধিক Student Entity এর সাথে সম্পর্কিত থাকতে পারে।
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public ICollection<Student> Students { get; set; }
}
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public int CourseId { get; set; }
public Course Course { get; set; }
}
এখানে, Course Entity তে ICollection Students ব্যবহার করা হয়েছে, যা নির্দেশ করে যে একটি Course একাধিক Student এর সাথে সম্পর্কিত। আর Student Entity তে Course এর সাথে সম্পর্ক রয়েছে।
Many-to-Many সম্পর্ক তখন তৈরি হয় যখন দুটি Entity একে অপরের সাথে একাধিক সম্পর্ক রাখে। যেমন, একটি Student একাধিক Course এর সাথে সম্পর্কিত হতে পারে এবং একটি Course একাধিক Student এর সাথে সম্পর্কিত হতে পারে।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public ICollection<Student> Students { get; set; }
}
এখানে, Student এবং Course Entity গুলির মধ্যে ICollection এবং ICollection এর মাধ্যমে Many-to-Many সম্পর্ক প্রতিষ্ঠিত হয়েছে। EF Core সাধারণত Join Table তৈরি করে এই সম্পর্ক সঠিকভাবে রেপ্রেজেন্ট করতে।
Navigational Properties হল Entity ক্লাসের প্রপার্টি, যা অন্যান্য Entity গুলির মধ্যে সম্পর্কের মাধ্যমে ডেটা অ্যাক্সেস করতে সাহায্য করে। Navigational properties সাধারণত দুটি Entity এর মধ্যে সম্পর্ক স্থাপন এবং তাদের মধ্যে সম্পর্কিত ডেটা পাঠানোর কাজ করে।
নির্দিষ্ট Entity তে সম্পর্কিত অন্য Entity এর ডেটা অ্যাক্সেস করতে Navigational Properties ব্যবহার করা হয়।
যেমন, আমরা যদি একটি Course এর সাথে সম্পর্কিত সব Student গুলো দেখতে চাই, তাহলে Course Entity তে Students নামক Navigational Property ব্যবহার করা হবে।
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public ICollection<Student> Students { get; set; }
}
এখানে, Students
একটি Navigational Property যা Course Entity এর সাথে সম্পর্কিত Student গুলোকে রেফারেন্স করে। এর মাধ্যমে আপনি একটি কোর্সের সব ছাত্রদের অ্যাক্সেস করতে পারবেন।
Many-to-Many সম্পর্কের জন্য Navigational Properties ব্যবহার করা হয় দুইটি Entity তে। যেমন, Student এবং Course এর মধ্যে একটি Many-to-Many সম্পর্ক ছিল। এখানে, Student এবং Course উভয় Entity তে Navigational Properties থাকবে।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
public ICollection<Student> Students { get; set; }
}
এখানে, Student Entity তে Courses
এবং Course Entity তে Students
Navigational Properties ব্যবহার করা হয়েছে।
Microsoft.EntityFrameworkCore.Proxies
প্যাকেজ ইনস্টল করতে হয় এবং ডিফল্টভাবে সম্পর্কিত Entity গুলির জন্য Navigational Properties লোড করা হয়।services.AddDbContext<ApplicationDbContext>(options =>
options.UseLazyLoadingProxies().UseSqlServer(connectionString));
var studentsWithCourses = context.Students
.Include(s => s.Courses)
.ToList();
context.Entry(student)
.Collection(s => s.Courses)
.Load();
Entity Framework (EF) এ Primary Key এবং Foreign Key কনফিগারেশন অত্যন্ত গুরুত্বপূর্ণ, কারণ এগুলি ডেটাবেস টেবিলগুলোর মধ্যে সম্পর্ক স্থাপন করে এবং ডেটাবেসের এককরণ এবং অখণ্ডতা (data integrity) নিশ্চিত করে। Primary Key টেবিলের প্রতিটি রেকর্ডের জন্য একক চিহ্নিতকারী হিসেবে কাজ করে, এবং Foreign Key এক টেবিলের রেকর্ডকে অন্য টেবিলের সাথে যুক্ত করে।
এই টিউটোরিয়ালে আমরা দেখব কিভাবে EF-এ Primary Key এবং Foreign Key কনফিগার করা হয়।
Primary Key একটি টেবিলের প্রতিটি রেকর্ডকে ইউনিকভাবে চিহ্নিত করতে ব্যবহৃত হয়। EF-এ, প্রতিটি Entity ক্লাসের মধ্যে একটি প্রপার্টি যা Primary Key হিসেবে কাজ করে তা কনফিগার করা হয়। EF স্বয়ংক্রিয়ভাবে Id
বা {ClassName}Id
প্রপার্টিকে Primary Key হিসেবে শনাক্ত করে, তবে আপনি নিজে কাস্টম প্রপার্টি দিয়ে এই কনফিগারেশন করতে পারেন।
public class Student
{
[Key] // Primary Key কনফিগারেশন
public int StudentId { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
এখানে:
StudentId
প্রপার্টি Primary Key হিসেবে কাজ করছে।[Key]
Data Annotation ব্যবহার করে StudentId
কে Primary Key হিসেবে চিহ্নিত করা হয়েছে।Fluent API ব্যবহার করে Primary Key কনফিগারেশন:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasKey(s => s.StudentId); // Fluent API দিয়ে Primary Key কনফিগারেশন
}
এখানে:
HasKey(s => s.StudentId)
Fluent API ব্যবহার করে StudentId
কে Primary Key হিসেবে কনফিগার করা হয়েছে।Foreign Key এক টেবিলের রেকর্ডকে অন্য টেবিলের রেকর্ডের সাথে সম্পর্কিত করে। EF তে Foreign Key কনফিগারেশন করতে হলে, দুটি টেবিলের মধ্যে সম্পর্ক স্থাপন করতে হয়, যেমন এক Student অনেক Course পড়তে পারে, বা একটি Order একটি Customer এর সাথে সম্পর্কিত হতে পারে।
EF তে Foreign Key কনফিগারেশন করার জন্য আপনি:
{ClassName}Id
)ধরা যাক, আমাদের একটি Student
এবং Course
টেবিল আছে এবং আমরা চাচ্ছি, Student
টেবিলের মধ্যে একটি CourseId
প্রপার্টি থাকবে, যা Foreign Key হিসেবে কাজ করবে।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
public int CourseId { get; set; } // Foreign Key
// Navigation Property
public Course Course { get; set; } // Navigation to Course
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
// Navigation Property
public ICollection<Student> Students { get; set; } // One-to-Many relationship
}
এখানে:
CourseId
একটি Foreign Key হিসেবে Student
টেবিলের মধ্যে যুক্ত হয়েছে।Course
একটি Navigation Property, যা Course
টেবিলের সাথে সম্পর্ক স্থাপন করে।আপনি Fluent API দিয়ে আরও কাস্টম ফ্লেক্সিবিলিটি সহ Foreign Key কনফিগার করতে পারেন।
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>()
.HasOne(s => s.Course) // One-to-Many Relationship
.WithMany(c => c.Students)
.HasForeignKey(s => s.CourseId) // CourseId is the Foreign Key
.OnDelete(DeleteBehavior.Restrict); // Define delete behavior
}
এখানে:
HasOne(s => s.Course)
দিয়ে Student এবং Course এর মধ্যে সম্পর্ক স্থাপন করা হয়েছে।WithMany(c => c.Students)
দিয়ে এক Course অনেক Student-কে সম্পর্কিত করছে।HasForeignKey(s => s.CourseId)
দিয়ে CourseId
কে Foreign Key হিসেবে কনফিগার করা হয়েছে।OnDelete(DeleteBehavior.Restrict)
দিয়ে Cascade Delete বন্ধ করে দেওয়া হয়েছে, অর্থাৎ Course
ডিলিট করলে Student
ডিলিট হবে না।EF তে Foreign Key সম্পর্কের তিনটি প্রধান টাইপ রয়েছে:
public class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public int ProfileId { get; set; }
// Navigation Property
public Profile Profile { get; set; } // One-to-One relationship
}
public class Profile
{
public int ProfileId { get; set; }
public string Bio { get; set; }
// Navigation Property
public Employee Employee { get; set; } // One-to-One relationship
}
public class Department
{
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
// Navigation Property
public ICollection<Employee> Employees { get; set; } // One-to-Many relationship
}
public class Employee
{
public int EmployeeId { get; set; }
public string Name { get; set; }
public int DepartmentId { get; set; } // Foreign Key
// Navigation Property
public Department Department { get; set; }
}
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
// Navigation Property
public ICollection<Course> Courses { get; set; } // Many-to-Many relationship
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
// Navigation Property
public ICollection<Student> Students { get; set; }
}
Primary Key এবং Foreign Key কনফিগারেশন Entity Framework-এ ডেটাবেসের কাঠামো এবং সম্পর্কের সঠিক পরিচালনা নিশ্চিত করে। ডেটাবেসে সঠিক সম্পর্ক স্থাপন করে, EF আমাদের CRUD অপারেশনগুলিকে আরো কার্যকরী ও নিরাপদ করে তোলে। Data Annotations
এবং Fluent API
উভয়ই শক্তিশালী কনফিগারেশন টুল হিসেবে কাজ করে, যা ডেটাবেস সম্পর্কের জন্য নমনীয়তা এবং কাস্টমাইজেশন প্রদান করে।
Entity Framework (EF) এ Navigational Properties এবং Lazy Loading দুটি অত্যন্ত গুরুত্বপূর্ণ বিষয়। এই দুটি ফিচার ডেটাবেস সম্পর্ক (relationships) পরিচালনায় সাহায্য করে এবং ডেটাবেসের সাথে সম্পর্কিত ডেটা রিট্রাইভ করতে একাধিক উপায় প্রদান করে।
Navigational Properties এমন প্রপার্টি, যা এক Entity থেকে অন্য Entity এর সাথে সম্পর্ক তৈরি করে। EF তে, Navigational Properties এর মাধ্যমে আপনি One-to-One, One-to-Many, এবং Many-to-Many সম্পর্ক তৈরি করতে পারেন। এই প্রপার্টিগুলি সাধারণত Entity ক্লাসের মধ্যে একটি রেফারেন্স হিসেবে থাকে এবং ডেটাবেসের টেবিলগুলোর মধ্যে সম্পর্ক স্থাপন করে।
ধরা যাক, আমাদের একটি Student
এবং Course
টেবিল আছে, যেখানে একজন ছাত্র একাধিক কোর্সে রেজিস্টার করতে পারে। এই সম্পর্ক One-to-Many।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
// Navigational Property for the related Courses
public ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
// Foreign Key for the related Student
public int StudentId { get; set; }
public Student Student { get; set; } // Navigational Property
}
এখানে:
Student
ক্লাসে Courses একটি Navigational Property হিসেবে সংজ্ঞায়িত করা হয়েছে, যা ICollection টাইপের, অর্থাৎ একজন ছাত্রের একাধিক কোর্স থাকতে পারে।Course
ক্লাসে Student এবং StudentId
প্রপার্টি রয়েছে, যা Foreign Key হিসেবে কাজ করে এবং Student
Entity এর সাথে সম্পর্ক স্থাপন করে।এইভাবে, আপনি EF এর মাধ্যমে সম্পর্কিত টেবিলের ডেটা একত্রে রিট্রাইভ করতে পারেন।
Lazy Loading হল একটি বৈশিষ্ট্য যা EF তে ডেটা রিট্রাইভ করার সময় নির্দিষ্ট সম্পর্কিত Entity এর ডেটা শুধুমাত্র তখনই লোড হয়, যখন সেটি প্রথমবারের মতো প্রয়োজন হয়। এটি দ্বিতীয় পর্যায়ের লোডিং হিসেবেও পরিচিত, কারণ শুধুমাত্র Navigational Property এর মাধ্যমে অন্য Entity রেফারেন্স করা হলে, EF ঐ Entity এর ডেটা লোড করবে।
Lazy Loading সুবিধা হল যে, এটি যখন প্রয়োজন হবে, তখনই সম্পর্কিত ডেটা লোড হয়, ফলে অপ্রয়োজনীয় ডেটা লোডের ঝামেলা কমে।
Lazy Loading সক্ষম করার জন্য, প্রথমে আপনার Navigational Property গুলিকে virtual করতে হবে, যাতে EF নিজে স্বয়ংক্রিয়ভাবে সম্পর্কিত ডেটা লোড করতে পারে।
public class Student
{
public int StudentId { get; set; }
public string Name { get; set; }
// Virtual Navigational Property for the related Courses (Enable Lazy Loading)
public virtual ICollection<Course> Courses { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CourseName { get; set; }
// Foreign Key for the related Student
public int StudentId { get; set; }
public Student Student { get; set; } // Navigational Property
}
এখানে:
public virtual ICollection<Course> Courses { get; set; }
: virtual কিওয়ার্ডের মাধ্যমে Lazy Loading সক্ষম করা হয়েছে।Lazy Loading চালু করার জন্য DbContext এ অবশ্যই Proxies সক্রিয় থাকতে হবে। এটি EF Core তে ডিফল্টভাবে সক্রিয় থাকে, তবে EF 6 তে কিছু কনফিগারেশন করতে হয়।
যখন আপনি Student
Entity এর Courses প্রপার্টি এক্সেস করবেন, EF তখন স্বয়ংক্রিয়ভাবে Course টেবিলের ডেটা লোড করবে। উদাহরণস্বরূপ:
using (var context = new SchoolContext())
{
var student = context.Students.FirstOrDefault(s => s.StudentId == 1);
// Lazy Loading will load the Courses data when accessed
var courses = student.Courses;
foreach (var course in courses)
{
Console.WriteLine(course.CourseName);
}
}
এখানে, student.Courses
এক্সেস করার সময় EF Courses টেবিলের ডেটা লোড করবে, যদি তা আগে লোড না করা থাকে।
Lazy Loading এবং Eager Loading দুটি আলাদা কৌশল, যা EF তে সম্পর্কিত ডেটা লোড করতে ব্যবহৃত হয়:
using (var context = new SchoolContext())
{
var student = context.Students
.Include(s => s.Courses) // Eager Loading for related Courses
.FirstOrDefault(s => s.StudentId == 1);
foreach (var course in student.Courses)
{
Console.WriteLine(course.CourseName);
}
}
এখানে:
Include(s => s.Courses)
ব্যবহৃত হয়েছে, যা Courses সম্পর্কিত ডেটা একসাথে লোড করবে।EF এ সম্পর্কিত ডেটা লোড করার জন্য Lazy Loading এবং Eager Loading উভয় কৌশলই ব্যবহার করা যায়, তবে প্রতিটি কৌশলের পারফরম্যান্সের পার্থক্য থাকতে পারে, তাই আপনার প্রয়োজনের উপর ভিত্তি করে সঠিক কৌশল নির্বাচন করা গুরুত্বপূর্ণ।
Entity Framework (EF) এ ডেটা লোড করার সময় বিভিন্ন লোডিং কৌশল ব্যবহার করা হয়, যার মাধ্যমে সম্পর্কিত ডেটা দ্রুত এবং কার্যকরীভাবে লোড করা যায়। Eager Loading এবং Explicit Loading দুটি জনপ্রিয় কৌশল, যা EF এ সম্পর্কিত ডেটা লোড করার জন্য ব্যবহৃত হয়।
Eager Loading হলো একটি কৌশল যেখানে সম্পর্কিত ডেটা প্রাথমিক কুয়েরির সাথে একসাথে লোড করা হয়। এটি মূলত তখন ব্যবহৃত হয় যখন আপনি নিশ্চিত হতে চান যে মূল অবজেক্ট এবং এর সম্পর্কিত অবজেক্টগুলো একই সময়ে লোড হবে। EF এ Eager Loading সাধারণত Include() মেথডের মাধ্যমে সম্পন্ন হয়।
ধরা যাক, একটি Customer
ক্লাস এবং একটি Order
ক্লাস আছে, যেখানে Customer
এর সাথে একাধিক Order
সম্পর্কিত রয়েছে।
var customersWithOrders = context.Customers
.Include(c => c.Orders) // Eager loading to include related Orders
.ToList();
এই কুয়েরি Customer
এবং তার সমস্ত Order
একসাথে লোড করবে। Include()
মেথডটি আপনাকে Customer
এর সাথে সম্পর্কিত Orders
ডেটা একসাথে লোড করার অনুমতি দেয়।
আপনি একাধিক সম্পর্কও Eager Loading এর মাধ্যমে লোড করতে পারেন:
var customersWithOrdersAndPayments = context.Customers
.Include(c => c.Orders)
.Include(c => c.Payments)
.ToList();
এখানে Customer
এর সাথে Orders
এবং Payments
সম্পর্কিত ডেটা একসাথে লোড করা হবে।
Eager Loading এর সমস্যা হতে পারে N+1 Query Problem। যখন আপনি Include()
ব্যবহার করেন, তখন EF প্রতিটি সম্পর্কের জন্য আলাদা কুয়েরি চালাতে পারে, বিশেষত যখন আপনি একাধিক সম্পর্কের ডেটা লোড করেন।
Explicit Loading হলো একটি কৌশল যেখানে সম্পর্কিত ডেটা সুনির্দিষ্টভাবে পরবর্তীতে লোড করা হয়, এর মাধ্যমে আপনি সম্পর্কিত ডেটাকে আপনার প্রয়োজনের ভিত্তিতে এক্সপ্লিসিটলি লোড করতে পারেন। EF এ Explicit Loading সাধারনত Load()
মেথড ব্যবহার করে করা হয়, এবং এটি তখন ব্যবহৃত হয় যখন আপনি সম্পর্কিত ডেটা শুধুমাত্র তখন লোড করতে চান, যখন তা প্রয়োজন।
ধরা যাক, একটি Customer
ক্লাস এবং একটি Order
ক্লাস রয়েছে। আপনি প্রথমে Customer
লোড করবেন এবং তারপর সম্পর্কিত Orders
ডেটা পরবর্তীতে লোড করবেন।
var customer = context.Customers.FirstOrDefault(c => c.CustomerId == 1);
// Explicitly load the related Orders data
context.Entry(customer)
.Collection(c => c.Orders)
.Load();
এখানে প্রথমে Customer
লোড করা হয়েছে এবং পরবর্তীতে Orders
সম্পর্কিত ডেটা লোড করা হয়েছে। Entry()
মেথডটি সম্পর্কিত ডেটার প্রপার্টি নির্বাচন করার জন্য ব্যবহৃত হয় এবং Load()
মেথডটি সম্পর্কিত ডেটা লোড করে।
যদি আপনার প্রপার্টি Nullable হয়, তবে Include()
ব্যবহার করা যাবে না, এই ক্ষেত্রে Explicit Loading ব্যবহার করাই সবচেয়ে উপযুক্ত পদ্ধতি।
var customer = context.Customers.FirstOrDefault(c => c.CustomerId == 1);
// Explicitly load the related Address, which might be nullable
context.Entry(customer)
.Reference(c => c.Address)
.Load();
এখানে Address
প্রপার্টি Nullable হতে পারে, তাই Explicit Loading
ব্যবহার করা হয়েছে।
বৈশিষ্ট্য | Eager Loading | Explicit Loading |
---|---|---|
লোডিং টাইম | ডেটা একসাথে লোড করা হয়। | সম্পর্কিত ডেটা পরবর্তীতে লোড করা হয়। |
পারফরম্যান্স | একাধিক রাউন্ড ট্রিপ এড়ানো যায়, তবে N+1 Query সমস্যা হতে পারে। | শুধুমাত্র যখন প্রয়োজন, তখন ডেটা লোড হয়। |
কোডের জটিলতা | সহজ, তবে কিছু ক্ষেত্রে অপটিমাইজেশন প্রয়োজন। | কোডে আরও জটিলতা থাকে, তবে নির্দিষ্ট পরিস্থিতিতে ভালো। |
ডেটা অ্যাক্সেসের নিয়ন্ত্রণ | কম নিয়ন্ত্রণ (একই সময়ে সব সম্পর্কিত ডেটা লোড হয়)। | বেশি নিয়ন্ত্রণ (কখন, কোথায়, কীভাবে ডেটা লোড হবে তা নিয়ন্ত্রণ করা যায়)। |
Eager Loading এবং Explicit Loading দুটি গুরুত্বপূর্ণ কৌশল, যা Entity Framework এর সাথে সম্পর্কিত ডেটা লোড করার জন্য ব্যবহৃত হয়। আপনি যদি জানেন যে সম্পর্কিত ডেটার প্রয়োজন, তবে Eager Loading ব্যবহৃত হতে পারে, তবে যদি সম্পর্কিত ডেটা প্রয়োজন না হয় বা পরবর্তীতে লোড করতে চান, তবে Explicit Loading ব্যবহার করা উচিত।
common.read_more